#include "mystdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>


#define DEFAULT_FILE_MODE 0666

// "w" "a" "r" 假设只有这三种需求
_FILE* _fopen(const char* path, const char* mode)
{
    assert(path);
    assert(mode);

    int flag = 0; // 打开文件的方式
    int fd = -1; // 文件描述符

    //先对mode做解析，匹配对应的文件打开方式
    //通过系统调用open打开一个文件
    if(strcmp(mode, "w") == 0)
    {
        int flag = O_CREAT | O_WRONLY | O_TRUNC; // 决定open的打开方式
        fd = open(path, flag,DEFAULT_FILE_MODE);
    }
    else if(strcmp(mode, "a") == 0)
    {
        int flag = O_CREAT | O_WRONLY | O_APPEND; // for open;
        fd = open(path, flag,DEFAULT_FILE_MODE);
    }
    else if(strcmp(mode, "r") == 0)
    {
        int flag = O_RDONLY; // for open;
        fd = open(path, flag);

    }
    else return NULL; // mode 不匹配，返回NULL

    if(fd == -1) //打开失败，返回空，还可以设置错误码，这里我就不做了
        return NULL;

    //malloc一个_FILE*返回给上层
    _FILE* ret = (_FILE*)malloc(sizeof(_FILE));

    if(ret == NULL) return NULL; //申请失败，还可以设置一下错误码

    //设置fd
    ret->fileno = fd;

    return ret;
}

void _fclose(_FILE* pf)
{
    assert(pf);
    close(pf->fileno); // 通过系统调用，用文件描述符将文件关闭。
    free(pf); //释放动态内存
}

int _fwrite(_FILE* pf, const char* data, int len)
{

}
